#ifndef MINI_TTELNET_H
#define MINI_TTELNET_H

#include <unistd.h>
#include <string.h>
#include <stdint.h>
#include <stdint.h>
#include <stdio.h>
#include <stdarg.h>
#ifdef _cplusplus
extern "C" {
#endif


/*
	命令信息结构体，请勿修改
	回调参数最高支持32个
*/
typedef struct {
	const char *pCmd;
	const char *pHelp;
	uint8_t (*pInit)(void);
	unsigned char(*pFun)(int , char **);
} COMMAND_S;
/*
	发送单字符函数类型
*/
typedef int (*func_send)(uint8_t *,uint16_t );

/*
    telnet 客户机接入主动发起协商
*/
/** 
 * @brief telnet_client_conn_callback		
 * @param pcmd    		注册命令信息缓存
 * @param u16cmd_num	命令个数
 * @param fputc			发送字符的方法
 *
 * @return void
 */
int telnet_client_conn_callback(const COMMAND_S *pcmd,char* name,char* password,uint16_t u16cmd_num,func_send fsend);
/*
    telnet 
*/
int telnet_client_disconn_callback(void);
/*
    telnet 
*/
int telnet_client_recv_callback(uint8_t *pbuff,uint16_t len);

/** 
 * @brief sh_printf				mini telnet 打印函数，会通过fputc注册的发送单个字符的方法发送
 * @param fmt    		...
 *
 * @return void
 */
extern void sh_printf(const char *fmt, ...);

/*
这里举一个最基本的例子：

1)   TCP:     192.168.1.11:49200 > 192.168.1.1:23        [SYN]
2)   TCP:     192.168.1.1:23     > 192.168.1.11:49200    [SYN,ACK]
3)   TCP:     192.168.1.11:49200 > 192.168.1.1:23        [ACK]
4)   TELNET:  23 > 49200  IAC DO 24     ( 表示让接收方激活终端类型动 Command: Do Terminal Type)
5)   TELNET:  49200 > 23   IAC WILL 24 / IAC WILL 31 （两条命令IAC WILL 24 IAC WILL 31 分别表示Command:Will Terminal Type / Command Will Negotiate About Window Size）告诉服务器同意终端类型，并且激活窗口大小.
6)   TELNET:  23 > 49200  IAC DO 31 / IAC SB 18 24 01 / IAC SE  （回应客户端允许协商窗口大小 / 子选项 Send your Terminal Type / 子选项结束）
7)   TELNET:  49200 >23  IAC SB 31 80 26 /  IAC SE ( 回应服务器，子选项 窗口大小为80/26  / 子选项结束)
8)   TELNET:  49200 >23  IAC SB 18 "ANSI" /  IAC SE (回应服务器，子选项 窗口类型为ANSI字符型  / 子选项结束)
9)   TELNET:  23 > 49200  IAC WILL 03 / IAC WILL 01  （告知客户端 允许抑制继续进行 / 允许回显）
10)  TELNET:  49200 >23  IAC DO 03 (回应服务器,接受方同意允许抑制继续进行)
11)  TELNET:  49200 >23  IAC DO 01 (回应服务器,接受方同意允许回显)
12)  TELNET： Data: ... （此时就开始正式传送数据，这些数据会回显到终端屏幕上）
13)  TELNET： Data: ... （此时就开始正式传送数据，这些数据会回显到终端屏幕上）
14)  TELNET： Data: ... （此时就开始正式传送数据，这些数据会回显到终端屏幕上）
15)  TCP:     192.168.1.11:49200 > 192.168.1.1:23        [FIN ACK]       (请求断开连接)
16)  TCP:     192.168.1.1:23     > 192.168.1.11:49200    [ACK]
17)  TCP:     192.168.1.1:23 > 192.168.1.11:49200        [FIN ACK]       (请求断开连接)
18)  TCP:     192.168.1.11:49200     > 192.168.1.1:23    [ACK]

*/



#ifdef _cplusplus
}
#endif


#endif